/****************************************Copyright (c)**********************************************
**                               		特飞科技公司
**
* 文    件 : 多MOSFET驱动IC TLE92108驱动头文件
* 作    者 : 李海洋
* 版    本 ：v1.0
* 完成时间 : 2023年6月24日
* 描    述 ：该驱动只支持软件片选且在外部使能片选信号. 使用步骤:
*			1#使用该驱动时应在Includes.h中包含该头文件, 且位于配置定义或Config.h头文件之后!
*			  需要在配置头文件或配置定义定义以下配置宏定义
*			  #define USE_SPI_NUM		1	//定义使用SPI数量
*			  #define NO_USE_FREE_RTOS	//如果不使用操作系统需要明确给出定义
*			2#在c文档中定义SPI驱动对象的结构指针
*			  sSPI_DRIVER *pXXX;
*			3#调用SPI_Init给pXXX赋值
*			  SPI_Init(&pXXX, &spi_handle, CpltSemHandle);
*			4#使能片选信号然后根据需要分别调用以下3个方法. 这些方法属于同步调用
*			  SPI_Only_Tx, SPI_Only_Rx, SPI_Tx_Rx
**--------------------------------------------------------------------------------------------------
* 修 改 人 ：
* 版    本 ：
* 修改时间 : 年月日
* 修改内容 : 
****************************************************************************************************
*/
#pragma once

#include "SPI_Driver.h"

#pragma region //===TLE92108寄存器定义===
//注意:对该寄存器的任何写访问都必须反转WDTRIG位。否则，设备进入故障安全模式。
enum GENCTRL1_BIT
{
	WDTRIG	= (1 << 0), //[rw]看门狗触发位. 该位必须在看门狗周期内反转。上电复位后，默认值为0。
	WDPER	= (1 << 1), //[rw]看门狗监督周期. 0-50ms, 1-200ms(默认)
	OCEN	= (1 << 2), //[rw]过电流关断使能. 0-禁止, 1-使能(默认)
	IPCHGADT = (1 << 3), //[rw]适应预充预放电电流. 0-1个电流步(默认), 1-2个电流步
	
	FMODE	= (1 << 5), //[rw]频率调制. 0-不调制, 1-调制频率15.6kHz(默认)
	UNLOCK	= (1 << 7), //[rw]解锁禁用看门狗位. 0-WDDIS不能重置(默认), 1-WDDIS(GENCTRL2)可以在下一SPI帧中复位
	VSOVTH	= (1 << 8), //[rw]Vs过电压阈值. 0-Vsovoff = Vsovoff1(min. 19V, 默认), 1-Vsovoff = Vsovoff2(min. 29V)
	REG_BANK = (1 << 9), //[rw]寄存器块. 0-(默认)参考CCP_BLK2_ACT, PWM_ICHGMAX_CCP_BLK3_ACT, PWM_ICHG_ACT, ST_ICHG, PWM_IDCHG_ACT. 
						//1-参考CCP_BLK2_FW, PWM_ICHGMAX_CCP_BLK3_FW，PWM_ICHG_FW、PWM_PDCHG_INIT PWM_PCHG_INIT
	CSAG1	= (3 << 10), //[rw]电流感测放大器增益1. 00-10V/V(默认), 01-20V/V, 10-40V/V, 11-80V/V
	CSD1	= (1 << 12), //[rw]电流感测方向放大器1. 0-电流感测是单向的(默认), 1-电流感测是双向的
	CSAG2	= (3 << 13), //[rw]电流感测放大器增益2. 00-10V/V(默认), 01-20V/V, 10-40V/V, 11-80V/V
	CSD2	= (1 << 15), //[rw]电流感测方向放大器2. 0-电流感测是单向的(默认), 1-电流感测是双向的
	sCS		= 3,
};
//Vs过电压阈值
typedef enum
{
	VsOV19V = 0,
	VsOV29V = VSOVTH,
} VsOV_Threshold;
//电流感测放大器的方向
typedef enum
{
	UNIDIRECTIONAL	= 0,
	BIDIRECTIONAL	= CSD1,
} CSA_Direction;
//电流检测放大器的增益
typedef enum
{
	K10	= 0,
	K20	= (1 << 10),
	K40	= (2 << 10),
	K80 = CSAG1,
} CSA_Gain;
//
enum GENCTRL2_BIT
{
	OCTH1	= (3 << 0), //[rw]CSD1=0时CSO1过流检测门限. 00-Vcso1>VDD/2(默认), 01-Vcso1>VDD*0.6, 10-Vcso1>VDD*0.7, 11-Vcso1>VDD*0.8。
						//CSD1=1时CSO1过流检测门限. 00-0.6<或<0.4VDD(默认), 01-0.7<或<0.3VDD, 10-0.75<或<0.25VDD, 11-0.8<或<0.2VDD。
	OCTH2	= (3 << 2), //[rw]CSD2=0时CSO2过流检测门限. 00-Vcso2>VDD/2(默认), 01-Vcso2>VDD*0.6, 10-Vcso2>VDD*0.7, 11-Vcso2>VDD*0.8。
						//CSD2=1时CSO2过流检测门限. 00-0.6<或<0.4VDD(默认), 01-0.7<或<0.3VDD, 10-0.75<或<0.25VDD, 11-0.8<或<0.2VDD。
	TFVDS	= (3 << 4), //[rw]漏源电压监测滤波时间. 00-0.5us(默认), 01-1us, 10-2us, 11-3us
	CPSTGA	= (1 << 6), //[rw]双泵和单泵自动切换. 0-自动切换未激活(默认), 1-自动切换激活
	CPUVTH	= (1 << 7), //[rw]电荷泵欠压检测阈值. 0-VCPUV(相对VS) = 6.0V, 1-VCPUV(相对VS) = 7.5V(默认)
	MSKTDREG = (1<< 8), //[rw]在全局错误标志中屏蔽开/关延迟错误. 0-在GEF中报告开/关延迟错误, 1-打开/关闭延迟错误在GEF中被屏蔽(默认)
	WDDIS	= (1 << 9), //[rw]看门狗禁用位. 0-看门狗开启(默认), 1-如果之前的SPI帧设置了解锁位(GENCTRL1)，看门狗被禁用。
	IHOLD	= (1<< 10), //[rw]栅极驱动器保持电流IHOLD. 0-(默认)充电12.5mA放电14.2mA, 1-充电23.9mA放电26.0mA
	AGC		= (3<< 11), //[rw]自适应栅极控制. 00-(默认)禁用自适应栅极控制，禁用预充和预放电, 01-禁用自适应栅极控制，禁用预充，使用IPREDCHG =IPDCHGINIT使能预放电(参考PWM_PCHG_INIT), 
						//10-使能自适应栅极控制，IPRECHG和IPREDCHG自适应, 11-保留。使能自适应栅极控制，IPRECHG和IPREDCHG自适应
	AGCFILT	= (1<< 13), //[rw]自适应栅极控制滤波器. 0-未应用滤波器(默认), 1-使用滤波器
	BD_PASS = (1<< 14), //[rw]桥式驱动器模式. 0-桥驱动处于主动模式, 1-桥驱动处于被动模式(默认)
	POCHGDIS = (1<<15),	//[rw]后充电禁用位. 0-后充电阶段在PWM期间启用(默认), 1-后充电阶段在PWM期间禁用
	sOCTH	= 2,
};
//过流检测门限
typedef enum
{
	//电流是单向的
	VDDx0V5			= 0,
	VDDx0V6,
	VDDx0V7,
	VDDx0V8,
	//电流是双向的
	VDDxL0V4G0V6	= 0,	//低于0.4*VDD,或高于0.6*VDD
	VDDxL0V3G0V7,
	VDDxL0V25G0V75,
	VDDxL0V2G0V8,
} VcsoOC_Threshold;
//漏源电压监测滤波时间
typedef enum
{
	TFVds0u5 = (0 << 4), //默认
	TFVds1u  = (1 << 4),
	TFVds2u  = (2 << 4),
	TFVds3u  = (3 << 4),
} VdsFilterTime;
//漏源监测阈值HB1-4
enum VDS1_BIT
{
	HB1VDSTH = (7 << 0), //[rw]HB1漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB2VDSTH = (7 << 3), //[rw]HB2漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB3VDSTH = (7 << 6), //[rw]HB3漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB4VDSTH = (7 << 9), //[rw]HB4漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB1D	= (1<<12),	//[rw]HS1漏源监测. 0-漏源监测:DH - VSH1(默认), 1-漏源监测:CSIN1 - VSH1
	HB2D	= (1<<13),	//[rw]HS2漏源监测. 0-漏源监测:DH - VSH2(默认), 1-漏源监测:CSIN1 - VSH2
	HB3D	= (1<<14),	//[rw]HS3漏源监测. 0-漏源监测:DH - VSH3(默认), 1-漏源监测:CSIN1 - VSH3
	HB4D	= (1<<15),	//[rw]HS4漏源监测. 0-漏源监测:DH - VSH4(默认), 1-漏源监测:CSIN1 - VSH4
};
//漏源监测阈值HB5-8
enum VDS2_BIT
{
	HB5VDSTH = (7 << 0),	//[rw]HB5漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB6VDSTH = (7 << 3),	//[rw]HB6漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB7VDSTH = (7 << 6),	//[rw]HB7漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB8VDSTH = (7 << 9),	//[rw]HB8漏源过电压阈值. 000-0V15,001-0V2(默认),010-0V25,011-0V3,100-0V4,101-0V5,110-0V6,111-2V
	HB5D = (1 << 12),	//[rw]HS5漏源监测. 0-漏源监测:DH - VSH5(默认), 1-漏源监测:CSIN1 - VSH5
	HB6D = (1 << 13),	//[rw]HS6漏源监测. 0-漏源监测:DH - VSH6(默认), 1-漏源监测:CSIN1 - VSH6
	HB7D = (1 << 14),	//[rw]HS7漏源监测. 0-漏源监测:DH - VSH7(默认), 1-漏源监测:CSIN1 - VSH7
	HB8D = (1 << 15),	//[rw]HS8漏源监测. 0-漏源监测:DH - VSH8(默认), 1-漏源监测:CSIN1 - VSH8
};
//漏源过电压阈值
typedef enum
{
	VdsTh0V15 = (0 << 0),
	VdsTh0V2,	//默认
	VdsTh0V25,
	VdsTh0V3,
	VdsTh0V4,
	VdsTh0V5,
	VdsTh0V6,
	VdsTh2V
} VdsOV_Threshold;
//CCP和空白时间设置1
enum CCP_BLK1_BIT
{
	HB1CCPBLK	= (3 << 0),	//[rw]HB1的交叉电流保护和空白时间. (tHB1CCP, tHB1BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB2CCPBLK	= (3 << 2),	//[rw]HB2的交叉电流保护和空白时间. (tHB2CCP, tHB2BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB3CCPBLK	= (3 << 4),	//[rw]HB3的交叉电流保护和空白时间. (tHB3CCP, tHB3BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB4CCPBLK	= (3 << 6),	//[rw]HB4的交叉电流保护和空白时间. (tHB4CCP, tHB4BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB5CCPBLK	= (3 << 8),	//[rw]HB5的交叉电流保护和空白时间. (tHB5CCP, tHB5BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB6CCPBLK	= (3 << 10),	//[rw]HB6的交叉电流保护和空白时间. (tHB6CCP, tHB6BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB7CCPBLK	= (3 << 12),	//[rw]HB7的交叉电流保护和空白时间. (tHB7CCP, tHB7BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
	HB8CCPBLK	= (3 << 14),	//[rw]HB8的交叉电流保护和空白时间. (tHB8CCP, tHB8BLANK) = 00-(tCCP1, tBLANK1),01-(tCCP2, tBLANK2)...
};
//活动CCP和空白时间设置2
enum CCP_BLK2_ACT_BIT
{
	TCCP1_ACT = (7 << 0), //[rw]交叉电流保护-tCCP1活动. 见逆流电流保护时间, (默认)2us
	TBLANK1_ACT = (7 << 3), //[rw]空白时间- tBLANK1激活. 见漏源过电压空白时间, (默认)2us
	TCCP2_ACT = (7 << 6), //[rw]交叉电流保护-tCCP2活动. 见逆流电流保护时间, (默认)2us
	TBLANK2_ACT = (7 << 9), //[rw]空白时间- tBLANK2激活. 见漏源过电压空白时间, (默认)2us
	TCCP3_ACT = (7 << 12), //[rw]交叉电流保护-tCCP3活动. 见逆流电流保护时间, (默认)2us
};
//FW MOSFET的逆流电流保护和空白时间设定2
enum CCP_BLK2_FW_BIT
{
	TCCP1_FW = (7 << 0),	//[rw]交叉电流保护-tCCP1惯性. 见逆流电流保护时间, (默认)2us
	TBLANK1_FW = (7 << 3),	//[rw]空白时间- tBLANK1惯性. 见漏源过电压空白时间, (默认)2us
	TCCP2_FW = (7 << 6),	//[rw]交叉电流保护-tCCP2惯性. 见逆流电流保护时间, (默认)2us
	TBLANK2_FW = (7 << 9),	//[rw]空白时间- tBLANK2惯性. 见漏源过电压空白时间, (默认)2us
	TCCP3_FW = (7 << 12),	//[rw]交叉电流保护-tCCP3惯性. 见逆流电流保护时间, (默认)2us
};
//逆流电流保护时间
enum TCCP
{
	TCCP0u375	=	0,
	TCCP0u625	=	1,
	TCCP1u		=	2,
	TCCP1u5		=	3,
	TCCP2u		=	4,
	TCCP3u		=	5,
	TCCP4u		=	6,
	TCCP16u		=	7
};
//漏源过电压空白时间
enum TBLANK
{
	TBLANK0u625	=	0,
	TBLANK1u	=	1,
	TBLANK1u25	=	2,
	TBLANK1u5	=	3,
	TBLANK2u	=	4,
	TBLANK3u	=	5,
	TBLANK4u	=	6,
	TBLANK16u	=	7
};
//半桥模式位定义
enum HBMODE_BIT
{
	HB1MODE		= (3 << 0),	//[rw]半桥输出1模式选择. 见半桥输出模式
	HB2MODE		= (3 << 2),	//[rw]半桥输出2模式选择. 见半桥输出模式
	HB3MODE		= (3 << 4),	//[rw]半桥输出3模式选择. 见半桥输出模式
	HB4MODE		= (3 << 6),	//[rw]半桥输出4模式选择. 见半桥输出模式
	HB5MODE		= (3 << 8),	//[rw]半桥输出5模式选择. 见半桥输出模式
	HB6MODE		= (3 << 10),	//[rw]半桥输出6模式选择. 见半桥输出模式
	HB7MODE		= (3 << 12),	//[rw]半桥输出7模式选择. 见半桥输出模式
	HB8MODE		= (3 << 14),	//[rw]半桥输出8模式选择. 见半桥输出模式
};
//半桥输出模式
enum HALF_BRIDGE_MODE
{
	HB_HI	= 0,	//HB为高阻抗(默认)
	LS_ON	= 1,
	HS_ON	= 2,
	R_HB_HI = 3
};
//PWM通道设置位定义
enum PWMSET_BIT
{
	PWM1_EN		= (1 << 0),	//[rw]PWM通道1使能位. 0-PWM1禁止(默认), 1-PWM1使能
	PWM1_HB		= (7 << 1),	//[rw]PWM通道1的分配. 0-7=HB1-8, HB1(默认)
	PWM2_EN		= (1 << 4),	//[rw]PWM通道2使能位. 0-PWM2禁止(默认), 1-PWM2使能
	PWM2_HB		= (7 << 5),	//[rw]PWM通道2的分配. 0-7=HB1-8, HB4(默认)
	PWM3_EN		= (1 << 8),	//[rw]PWM通道3使能位. 0-PWM3禁止(默认), 1-PWM3使能
	PWM3_HB		= (7 << 9),	//[rw]PWM通道3的分配. 0-7=HB1-8, HB7(默认)
	PASS_MOD	= (3 << 12),	//[rw]桥驱动被动模式的设置. 00=LS1-4关闭, 01=LS1-4常开静制动, 
			//10=如果检测到被动VS OV(过压制动)，LS1-4被激活(默认), 11=如果检测到被动VS OV且PWM1 =高(由PWM1调节的过电压制动)，则LS1-4被激活
	//注意:将PASS_MOD从00更改为任何其他值都需要在写入PASS_MOD之前先清除DSOV。
	PASS_VDS	= (1 << 14),	//[rw]桥无源模式下漏源监测. 0=禁止, 1=启用桥被动模式下的DS监控(默认)
};
//PWM预充电和预放电时间位定义
enum TPRECHG_BIT
{
	TPCHG1		= (3 << 0),	//[rw]PWM通道1的预充电时间. 见PWM预充电和预放电时间定义
	TPDCHG1		= (3 << 2),	//[rw]PWM通道1的预放电时间. 见PWM预充电和预放电时间定义
	TPCHG2		= (3 << 4),	//[rw]PWM通道2的预充电时间. 见PWM预充电和预放电时间定义
	TPDCHG2		= (3 << 6),	//[rw]PWM通道2的预放电时间. 见PWM预充电和预放电时间定义
	TPCHG3		= (3 << 8),	//[rw]PWM通道3的预充电时间. 见PWM预充电和预放电时间定义
	TPDCHG3		= (3 << 10),	//[rw]PWM通道3的预放电时间. 见PWM预充电和预放电时间定义
	EN_GEN_CHECK = (1<<12),	//[rw]启用发电机检查. 0=禁止(默认), 1=启用发电机模式检测。
	EN_DEEP_AD	= (1 << 14),	//[rw]启用深度适应. 0=禁止(默认), 1=启用深度适应。
};
//PWM预充电和预放电时间定义
enum TPCHG_PDCHG
{
	TPCD0u125	= 0,	//默认
	TPCD0u25,
	TPCD0u5,
	TPCD1u
};
//半桥诊断电流控制位定义
enum HBIDIAG_BIT
{
	HB1IDIAG	= (1 << 0),	//[rw]控制HB1下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB2IDIAG	= (1 << 1),	//[rw]控制HB2下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB3IDIAG	= (1 << 2),	//[rw]控制HB3下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB4IDIAG	= (1 << 3),	//[rw]控制HB4下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB5IDIAG	= (1 << 4),	//[rw]控制HB5下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB6IDIAG	= (1 << 5),	//[rw]控制HB6下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB7IDIAG	= (1 << 6),	//[rw]控制HB7下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	HB8IDIAG	= (1 << 7),	//[rw]控制HB8下拉断开状态诊断. 0=下拉停用(默认), 1=下拉激活
	CSA1_OFF	= (1 << 8),	//[rw]禁用CSA1. 0=使能CSA1(默认), 1=禁用
	CSA2_OFF	= (1 << 9),	//[rw]禁用CSA2. 0=使能CSA2(默认), 1=禁用
	OC1FILT		= (3 << 10),	//[re]CSO1过流滤波时间. 见CSOx过流滤波时间
	OC2FILT		= (3 << 12),	//[re]CSO2过流滤波时间. 见CSOx过流滤波时间
	CSA1L		= (1 << 14),	//[rw]CSA1电平. 0=CSA1配置为低侧, 1=CSA1配置为高侧(默认)
	CSA2L		= (1 << 15),	//[rw]CSA2电平. 0=CSA2配置为低侧, 1=CSA2配置为高侧(默认)
	sOCFILT		= 2,
};
//电流检测放大器电平
typedef enum
{
	LOW_SIDE	= (0 << 14),
	HIGH_SIDE	= (1 << 14)
} CSA_Level;
//CSOx过流滤波时间
typedef enum
{
	TOCF6us		= (0 << 10),	//默认
	TOCF10us	= (1 << 10),
	TOCF50us	= (2 << 10),
	TOCF100us	= (3 << 10)
} OC_FilterTime;
//静电充放电电流选择
enum ST_ICHG_BIT
{
	ICHGST1		= (15 << 0),	//[rw]静态栅极驱动器充放电电流1. 见静电充放电电流,默认IC12mA5D14mA2
	ICHGST2		= (15 << 4),	//[rw]静态栅极驱动器充放电电流2. 见静电充放电电流,默认IC12mA5D14mA2
	HB1ICHGST	= (1 << 8),		//[rw]HB1充放电电流的选择. 0=静态充电/放电电流1应用于半桥1(默认)。1=静态充电/放电电流2应用于半桥1。
	HB2ICHGST	= (1 << 9),		//[rw]HB2充放电电流的选择. 0=静态充电/放电电流1应用于半桥2(默认)。1=静态充电/放电电流2应用于半桥2。
	HB3ICHGST	= (1 << 10),	//[rw]HB3充放电电流的选择. 0=静态充电/放电电流1应用于半桥3(默认)。1=静态充电/放电电流2应用于半桥3。
	HB4ICHGST	= (1 << 11),	//[rw]HB4充放电电流的选择. 0=静态充电/放电电流1应用于半桥4(默认)。1=静态充电/放电电流2应用于半桥4。
	HB5ICHGST	= (1 << 12),	//[rw]HB5充放电电流的选择. 0=静态充电/放电电流1应用于半桥5(默认)。1=静态充电/放电电流2应用于半桥5。
	HB6ICHGST	= (1 << 13),	//[rw]HB6充放电电流的选择. 0=静态充电/放电电流1应用于半桥6(默认)。1=静态充电/放电电流2应用于半桥6。
	HB7ICHGST	= (1 << 14),	//[rw]HB7充放电电流的选择. 0=静态充电/放电电流1应用于半桥7(默认)。1=静态充电/放电电流2应用于半桥7。
	HB8ICHGST	= (1 << 15),	//[rw]HB8充放电电流的选择. 0=静态充电/放电电流1应用于半桥8(默认)。1=静态充电/放电电流2应用于半桥8。
};
//静电充放电电流
enum ST_I_CHG_DHG
{
	IC1D1mA		= 0,
	IC2D2mA8,
	IC4mA5D5mA7,
	IC8D9mA4,
	IC12mA5D14mA2,
	IC17mA8D19mA7,
	IC23mA9D26,
	IC30D32mA,
	IC37mA1D39mA5,
	IC44mA3D46mA8,
	IC52mA3D54mA7,
	IC60mA2D62mA5,
	IC68mA3D70mA6,
	IC76mA8D78mA5,
	IC86D87mA,
	IC96D95mA
};
//初始PWM预充电电流选择
enum PWM_PCHG_INIT_BIT
{
	PCHGINIT1	= (32 << 0),	//[rw]PWM通道1的初始预充电流. 见PWM操作中的充电电流, 默认IC8mA
	PCHGINIT2	= (32 << 5),	//[rw]PWM通道2的初始预充电流. 见PWM操作中的充电电流, 默认IC8mA
	PCHGINIT3	= (32 << 10),	//[rw]PWM通道3的初始预充电流. 见PWM操作中的充电电流, 默认IC8mA
};
//有源MOSFET的PWM充电电流
enum PWM_ICHG_ACT_BIT
{
	ICHG1		= (32 << 0),	//[rw]PWM通道1的栅极驱动充电电流(有源MOSFET). 见PWM操作中的充电电流, 默认IC8mA
	ICHG2		= (32 << 5),	//[rw]PWM通道1的栅极驱动充电电流(有源MOSFET). 见PWM操作中的充电电流, 默认IC8mA
	ICHG3		= (32 << 10),	//[rw]PWM通道1的栅极驱动充电电流(有源MOSFET). 见PWM操作中的充电电流, 默认IC8mA
};
//FW MOSFET的PWM充放电电流
enum PWM_ICHG_FW_BIT
{
	ICHG1_FW	= (32 << 0),	//[rw]PWM通道1栅极驱动充放电电流(FW MOSFET). 见PWM操作中的充电和放电电流, 默认IC8mA,ID9mA4
	ICHG2_FW	= (32 << 5),	//[rw]PWM通道2栅极驱动充放电电流(FW MOSFET). 见PWM操作中的充电和放电电流, 默认IC8mA,ID9mA4
	ICHG3_FW	= (32 << 10),	//[rw]PWM通道3栅极驱动充放电电流(FW MOSFET). 见PWM操作中的充电和放电电流, 默认IC8mA,ID9mA4
};
//有源MOSFET的PWM放电电流
enum PWM_IDCHG_ACT_BIT
{
	IDCHG1		= (32 << 0),	//[rw]PWM通道1(有源MOSFET)放电电流. 见PWM操作中的放电电流, 默认ID11mA8
	IDCHG2		= (32 << 5),	//[rw]PWM通道2(有源MOSFET)放电电流. 见PWM操作中的放电电流, 默认ID11mA8
	IDCHG3		= (32 << 10),	//[rw]PWM通道3(有源MOSFET)放电电流. 见PWM操作中的放电电流, 默认ID11mA8
	CCSO		= (1 << 15)		//[rw]电容连接到电流感测放大器输出. 0=连接到CSO的电容< 100pf(默认).1=连接到CSO的电容< 400pf
};
//连接到电流感测放大器输出的电容
typedef enum
{
	CCSO100p	= 0,
	CCSO400p	= CCSO,
} CapacitorCCSO;
//PWM有源MOSFET预放电电流初始化
enum PWM_PDCHG_INIT_BIT
{
	PDCHGINIT1	= (32 << 0),	//[rw]PWM通道1的初始预放电电流. 见PWM操作中的放电电流, 默认ID26mA
	PDCHGINIT2	= (32 << 5),	//[rw]PWM通道2的初始预放电电流. 见PWM操作中的放电电流, 默认ID26mA
	PDCHGINIT3	= (32 << 10),	//[rw]PWM通道3的初始预放电电流. 见PWM操作中的放电电流, 默认ID26mA
	//同CCSO
};
//PWM操作中的充电电流
enum CHARGE_CURRENTS
{
	IC1mA		= 0,
	IC1mA5,
	IC2mA,
	IC3mA2,
	IC4mA5,
	IC6mA3,
	IC8mA,
	IC10mA3,
	IC12mA5,
	IC15mA1,
	IC17mA8,
	IC20mA8,
	IC23mA9,
	IC27mA,
	IC30mA,
	IC33mA5,
	IC37mA1,
	IC40mA7,
	IC44mA3,
	IC48mA3,
	IC52mA3,
	IC56mA2,
	IC60mA1,
	IC64mA2,
	IC68mA3,
	IC72mA5,
	IC76mA8,
	IC81mA4,
	IC86mA,
	IC91mA,
	IC96mA,
	IC100mA
};
//PWM操作中的放电电流
enum DISCHARGE_CURRENTS
{
	ID1mA		= 0,
	ID1mA9,
	ID2mA8,
	ID4mA3,
	ID5mA7,
	ID7mA5,
	ID9mA4,
	ID11mA8,
	ID14mA2,
	ID17mA,
	ID19mA7,
	ID22mA9,
	ID26mA,
	ID29mA,
	ID32mA,
	ID35mA8,
	ID39mA5,
	ID43mA1,
	ID46mA8,
	ID50mA8,
	ID54mA7,
	ID58mA6,
	ID62mA5,
	ID66mA6,
	ID70mA6,
	ID74mA6,
	ID78mA5,
	ID82mA8,
	ID87mA,
	ID91mA,
	ID95mA,
	ID100mA,
};
//PWM最大驱动电流选择和ACT有源|FW惯性tCCP4、tBLANK 3/4
enum PWM_ICHGMAX_CCP_BLK3_ACT_BIT
{
	ICHGMAX1	= (2 << 0),	//[rw]预充电和预放电阶段映射到PWM通道1的半桥最大驱动电流. 见最大驱动电流, 默认IC18mA8D19mA7
	ICHGMAX2	= (2 << 2),	//[rw]预充电和预放电阶段映射到PWM通道2的半桥最大驱动电流. 见最大驱动电流, 默认IC18mA8D19mA7
	ICHGMAX3	= (2 << 4),	//[rw]预充电和预放电阶段映射到PWM通道3的半桥最大驱动电流. 见最大驱动电流, 默认IC18mA8D19mA7
	TBLANK3		= (7 << 6),	//[rw]空白时间-tBLANK3_ACT有源|FW惯性. 见漏源过电压空白时间, 默认TBLANK2u
	TCCP4		= (7 << 9),	//[rw]交叉电流保护- tCCP4_ACT有源|FW惯性. 见逆流电流保护时间, 默认TCCP2u
	TBLANK4		= (7 << 12),	//[rw]空白时间-tBLANK4_ACT有源|FW惯性. 见漏源过电压空白时间, 默认TBLANK2u
};
//最大驱动电流
enum ICHG_DHG_MAX
{
	IC18mA8D19mA7	= 0,
	IC41mAD43mA,
	IC77mAD79mA,
	IC100mAD100mA
};
//选择PWM通道1,2,3的MOSFET通断延迟
enum TDON_OFF123
{
	TDON		= (255 << 0),	//[rw]PWM通道123的导通延迟时间。=62.5 * TDON1 ns, 默认62.5*10=625ns
	TDOFF		= (255 << 8),	//[rw]PWM通道123的关断延迟时间。=62.5 * TDOFF1 ns, 默认62.5*10=625ns
};

//一般状态寄存器位定义
enum GENSTAT_BIT
{
	CPUV		= (1 << 0),	//[rc]充电泵欠压. 0=无充电泵欠压(默认), 1=检测到电荷泵欠压,误差被锁存，外部mosfet被关断。
	VSUV		= (1 << 1),	//[rc]0=未检测到Vs欠压(默认值), 1=检测到Vs欠压,误差被锁存，外部mosfet被关断。
	VSOV		= (1 << 2),	//[rc]0=未检测到Vs过电压(默认值), 1=检测到Vs过电压,误差被锁存，外部mosfet被关断。
	OC1			= (1 << 3),	//[rc]0=CSO1无过流检测(默认), 1=CSO1过流被检测,外部mosfet的状态取决于OCEN位的设置(参见GENCTRL1)。
	OC2			= (1 << 4),	//[rc]0=CSO2无过流检测(默认), 1=CSO2过流被检测,外部mosfet的状态取决于OCEN位的设置(参见GENCTRL1)。
	TW			= (1 << 5),	//[rc]0=未检测到热警告(默认), 1=检测到热警告.
	TSD			= (1 << 6),	//[rc]0=未检测到热关机(默认), 1=检测到热关闭,误差被锁存，外部mosfet被关断。
	TDREG1		= (1 << 7),	//[rc]PWM通道1:0=开启延迟或关闭延迟没规定(默认), 1=开启和关闭延迟是有规定的
	TDREG2		= (1 << 8),	//[rc]PWM通道2:0=开启延迟或关闭延迟没规定(默认), 1=开启和关闭延迟是有规定的
	TDREG3		= (1 << 9),	//[rc]PWM通道3:0=开启延迟或关闭延迟没规定(默认), 1=开启和关闭延迟是有规定的
	PWM1STAT	= (1 << 10),	//[r]PWM1输入状态. 0=PWM是低电平, 1=PWM是高电平
	PWM2STAT	= (1 << 11),	//[r]PWM2输入状态. 0=PWM是低电平, 1=PWM是高电平
	PWM3STAT	= (1 << 12),	//[r]PWM3输入状态. 0=PWM是低电平, 1=PWM是高电平
	WDMON		= (3 << 13),	//[r]看门狗监测. 00=WD定时器在WD周期的[0% ~ 25%]之间(默认),01=[25%~50%],10[50%~75%],11=[75%~100%]
	PASS_VDSOV	= (1 << 15),	//[r]桥式驱动器处于被动模式时DS过电压. 0=任何低侧漏源无过电压(默认), 1=检测到其中一个低侧漏极源端过电压。
};
//漏源过电压
enum DSOV_BIT
{
	HS1DSOV		= (1 << 0),	//[rc]0=高侧1漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS1DSOV		= (1 << 1),	//[rc]0=低侧1漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS2DSOV		= (1 << 2),	//[rc]0=高侧2漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS2DSOV		= (1 << 3),	//[rc]0=低侧2漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS3DSOV		= (1 << 4),	//[rc]0=高侧3漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS3DSOV		= (1 << 5),	//[rc]0=低侧3漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS4DSOV		= (1 << 6),	//[rc]0=高侧4漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS4DSOV		= (1 << 7),	//[rc]0=低侧4漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS5DSOV		= (1 << 8),	//[rc]0=高侧5漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS5DSOV		= (1 << 9),	//[rc]0=低侧5漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS6DSOV		= (1 << 10),	//[rc]0=高侧6漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS6DSOV		= (1 << 11),	//[rc]0=低侧6漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS7DSOV		= (1 << 12),	//[rc]0=高侧7漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS7DSOV		= (1 << 13),	//[rc]0=低侧7漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	HS8DSOV		= (1 << 14),	//[rc]0=高侧8漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
	LS8DSOV		= (1 << 15),	//[rc]0=低侧8漏极无过压(默认), 1=过压，则受影响的MOSFET锁住。
};
//半桥输出电压状态和PWM错误
enum HBVOUT_PWMERR_BIT
{
	HB1VOUT		= (1 << 0), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB2VOUT		= (1 << 1), //[r]HB2MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB2D=0|VDH-VSH2|>Vv,当HB2D=1|VCSIN1-VSH2|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB3VOUT		= (1 << 2), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB4VOUT		= (1 << 3), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB5VOUT		= (1 << 4), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB6VOUT		= (1 << 5), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB7VOUT		= (1 << 6), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
	HB8VOUT		= (1 << 7), //[r]HB1MODE[1:0]=(0,0)或(1,1)时SH1点电压电平: 0=低:当HB1D=0|VDH-VSH1|>Vv,当HB1D=1|VCSIN1-VSH1|>Vv
							//1=高:当HB1D=0|VDH-VSH1|<Vv,当HB1D=1|VCSIN1-VSH1|<Vv.//Vv=VvDsMONTHx是为相应的半桥选择的漏源监测阈值。
};

#pragma pack(1)
typedef struct
{
	//以下为 控制寄存器
	uint16_t GENCTRL1;
	uint16_t GENCTRL2;
	uint16_t VDS1, VDS2;
	uint16_t CCP_BLK1;
	union 
	{
		uint16_t CCP_BLK2_ACT;
		uint16_t CCP_BLK2_FW; //REG_BANK = 1
	};
	uint16_t HBMODE;
	uint16_t PWMSET;
	uint16_t TPRECHG;
	uint16_t HBIDIAG;
	union 
	{
		uint16_t ST_ICHG;
		uint16_t PWM_PCHG_INIT; //REG_BANK = 1
	};
	union 
	{
		uint16_t PWM_ICHG_ACT;
		uint16_t PWM_ICHG_FW; //REG_BANK = 1
	};
	union 
	{
		uint16_t PWM_IDCHG_ACT;
		uint16_t PWM_PDCHG_INIT; //REG_BANK = 1
	};
	union 
	{
		uint16_t PWM_ICHGMAX_CCP_BLK3_ACT;
		uint16_t PWM_ICHGMAX_CCP_BLK3_FW; //REG_BANK = 1
	};
	uint16_t TDON_OFF1;
	uint16_t TDON_OFF2;
	uint16_t TDON_OFF3;
	//以下为 状态寄存器
	uint16_t GENSTAT;			//一般状态
	uint16_t DSOV;				//|漏源极过电压
	uint16_t HBVOUT_PWMERR;		//半桥输出电压
	uint16_t EFF_TDON_OFF[3];	//PWM通道1~3的有效MOSFET导通和关断延迟时间
	uint16_t TRISE_FALL[3];		//PWM通道1~3的有效MOSFET上升和下降时间
	uint16_t RESERVE[5];		//保留
	uint16_t DEVID;				//设备ID
} TLE92108_Reg_t;

//TLE92108通信数据协议
typedef union
{
	uint8_t Byte[3];
	struct 
	{
		uint8_t RegAddr;	//寄存器地址
		uint16_t Word;		//欲写入的字数据.高字节在先
	};
	struct 
	{
		struct 
		{
			uint8_t SPIE	: 1;
			uint8_t OC		: 1;
			uint8_t VDSE	: 1;
			uint8_t SUPE	: 1;
			uint8_t NPOR	: 1;
			uint8_t TE		: 1;
			uint8_t FS		: 1;
			uint8_t ZERO	: 1;
		};
		uint16_t ReadData;		//读取的字数据.高字节在先
	};
} TLE92108_Protocol_t;
#pragma pack()

//指向TLE92108寄存器指针
#define TLE92108_Reg		((TLE92108_Reg_t*)0)
//0x80=>是地址字节,0x40=>LABT最后地址字节
#define ADDR_LABT			(0xC0)
//获得寄存器地址,reg=寄存器,op=操作: 0=只读, 1=读写/对于控制寄存器 | 读清除/对于状态寄存器
#define GetRegAddr(p_reg, op)		(ADDR_LABT | ((uint32_t)p_reg) | op)
#define GetRA(reg, op)		(ADDR_LABT | ((uint32_t)&TLE92108_Reg->reg) | op)
#pragma endregion

#pragma region //===方法===
/*
********************************************************************************
 *描述: 初始化TLE92108
 ******************************************************************************/
int TLE92108_Init(void *handle/*[I]指向外设句柄*/,
	osSemaphoreId DoneSemId/*[I]SPI通讯完成信号量句柄*/);
/*
********************************************************************************
 *描述: 把所有桥驱动进入高阻模式并关闭看门狗
 ******************************************************************************/
void TLE_GotoStandbyMode(void);
/*
********************************************************************************
 *描述: 将指定H桥组进入高阻模式
 ******************************************************************************/
void TLE_GotoHighImpedanceMode(uint8_t cs/*芯片序号0,1,2*/, uint8_t group/*[I]组:0=1,2;1=3,4;2=5,6;3=7,8;*/);
/*
********************************************************************************
 *描述: 把H桥配置成单极模式.cs=芯片序号, 
 ******************************************************************************/
void TLE_ConfigUnipolarMode(uint8_t cs,
	uint8_t group/*[I]组:0=1,2;1=3,4;2=5,6;3=7,8;*/,
	uint8_t pwni/*[I]PWM编号:0=PWM1;1=PWM2;2=PWM3;*/,	
	uint8_t dir/*[I]方向:0=正向组,1=反向组;*/);
/*
********************************************************************************
 *描述: 喂狗. 在50或200ms内(根据设置看门狗溢出周期不同)至少喂狗一次
 ******************************************************************************/
void TLE_FeedDog(uint8_t cs);
#pragma endregion

